 _                         _
()                       ()
 =                         =
 | Cyberface Cracking Tour |
 |          1999           |
 |         Teil 2          |


Hallo Burschen und Mdls!
Dies ist also mein 2. Tutor und wie im letzten Tutor versprochen beschftigen wir uns heute mit einem etwas schwierigerem Programm.

Hier nochmal was ihr zum cracken braucht:
* einen Disasassembler (ich verwende W32DASM v8.93)
* einen Hexeditor (ich nehme immer Hexworkshop 2.54)
* eine Hand (fr Maus und Tastatur), Augen und ein bischen Hirn ...
Solltet ihr eines dieser Programme bzw. Organe nicht besitzen, dann knnt ihr euch zumindest einmal
die zwei Programm aus dem Internet saugen. Fragt nicht von wo ...

So, unser heutiges Progrmmchen nennt sich, wie nicht anders zu erwarten, PASS2.EXE

Als erstes Starten wir das Programm natrlich wieder...
aha, wieder die Meldung "Passworteingabe falsch!"
Also auf zu W32DASM! Sucht zuerst wieder nach obgiem String (Search/Find Text ...).
... und wir befinden uns wieder in der Passwortabfrage.
Diesmal haben wir es mit mehreren Abfragen nacheinander zu tun.
Also sehen wir uns zuerst einmal den Verlauf der Passwortabfrage an:

Als erstes bemerken wir einen jne Befehl. Es wird also irgendetwas miteinander verglichen. Weiter oben sehen wir den String
"hallo" und da wir uns in der Passwortabfrageroutine befinden, wird also "hallo" mit der Eingabe des Benutzers verglichen.
Der jne Befehl bedeutet also: Wenn die Benutzereingabe nicht "hallo" ist, dann jumpt das Programm zur Code-Location 0042CE23.
Sehen wir uns also die Stelle 0042CE23 an ...
Eine Benutzereingabe nicht pass ist, dann jumpt das Programm zur stelle 0042CE4C.
Diesesmal sehen wir keinen String. Aber ein Stckchen weiter steht wieder ein jne Befehl und darunter der String
"Passwort ist richtig!". Also wird bei diesem jne Befehl nochmal irgendetwas (nmlich das richtige Passwort!) mit der
Benutzereingabe verglichen. Wenn also die Benutzereingabe nicht gleich dem Passwort ist, dann jumpt das Progii zur Stelle
0042CE76 und dort steht dann wieder "Passworteingabe falsch!". Wenn aber die Benutzereingabe und das Passwort gleich sind,
dann fhrt das Programm normal fort. Das heit es zeigt den String "Passwort ist richtig!" an.

* Possible StringData Ref from Code Obj ->"hallo"               <== Die Passwortabfrage startet hier!
                                  |
:0042CE0B BAC8CE4200              mov edx, 0042CEC8
:0042CE10 E8BB6AFDFF              call 004038D0
:0042CE15 750C                    jne 0042CE23                  <== hallo wird mit der Benutzereingabe verglichen

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CDB0(C)
|

* Possible StringData Ref from Code Obj ->"Passworteingabe falsch!"
                                  |
:0042CE17 B8D8CE4200              mov eax, 0042CED8
:0042CE1C E89BFCFFFF              call 0042CABC
:0042CE21 EB7B                    jmp 0042CE9E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CE15(C)
|
:0042CE23 8D55FC                  lea edx, dword ptr [ebp-04] <== wenn d. Benutzereingabe nicht hallo ist, gehts hier weiter
:0042CE26 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042CE2C E8AFCFFEFF              call 00419DE0
:0042CE31 8B45FC                  mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"pass"
                                  |
:0042CE34 BAF8CE4200              mov edx, 0042CEF8
:0042CE39 E8926AFDFF              call 004038D0
:0042CE3E 750C                    jne 0042CE4C                      <== vergleich von "pass" und der Benutzereingabe

* Possible StringData Ref from Code Obj ->"Passworteingabe falsch!"
                                  |
:0042CE40 B8D8CE4200              mov eax, 0042CED8
:0042CE45 E872FCFFFF              call 0042CABC
:0042CE4A EB52                    jmp 0042CE9E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CE3E(C)
|
:0042CE4C 8D55FC                  lea edx, dword ptr [ebp-04]        <== hier gehts nach "pass" weiter
:0042CE4F 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042CE55 E886CFFEFF              call 00419DE0
:0042CE5A 8B45FC                  mov eax, dword ptr [ebp-04]
:0042CE5D 8B1510F74200            mov edx, dword ptr [0042F710]
:0042CE63 E8686AFDFF              call 004038D0
:0042CE68 750C                    jne 0042CE76             <== Passwort wird mit der Benutzereingabe verglichen

* Possible StringData Ref from Code Obj ->"Passwort ist richtig!"
                                  |
:0042CE6A B808CF4200              mov eax, 0042CF08
:0042CE6F E848FCFFFF              call 0042CABC
:0042CE74 EB28                    jmp 0042CE9E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CE68(C)
|
:0042CE76 8D55FC                  lea edx, dword ptr [ebp-04]      <== Bei falschem Passwort gehts hier weiter
:0042CE79 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042CE7F E85CCFFEFF              call 00419DE0
:0042CE84 8B45FC                  mov eax, dword ptr [ebp-04]
:0042CE87 8B1510F74200            mov edx, dword ptr [0042F710]
:0042CE8D E83E6AFDFF              call 004038D0
:0042CE92 740A                    je 0042CE9E

* Possible StringData Ref from Code Obj ->"Passworteingabe falsch!"
                                  |
:0042CE94 B8D8CE4200              mov eax, 0042CED8
:0042CE99 E81EFCFFFF              call 0042CABC



So, nun mssen wir das Programm wieder so umschreiben, da es bei jeder Eingabe "Passwort ist richtig!" anzeigt.
Am besten whre es, wenn das Programm berhaupt nichts vergleicht (d.h. alle Vergleiche berspringt).
Und genau da werden wir nun machen ...
Gehen wir also zum ersten jne Befehl. Dieser vergleicht "hallo" ... .Um den Vergleich (den jne Befehl) zu umgehen, mssen
wir jne mit einem Jump-Befehl (jmp) berschreiben. Wie man das macht habe ich im letzten Teil schon erklrt, also werde ich mich hier kurz fassen ... .Also den Offset (ohne dem h) aufschreiben (0002C215) und HexWorkshop gestartet. Nun zu diesem
Offset springen (Edit/Goto...) und die Zahl 75 mit EB (steht fr jmp) berschreiben.
Das gleiche machen wir mit dem 2. jne Befehl.
So nun sind wir beim 3. und letzten jne Befehl. Diesen drfen wir nicht mit einem jmp Befehl berschreiben, da er sonst
automatisch zu "Passworteingabe falsch!" jumpt. Wir knnten jne mit je (Jump if equal) berschreiben, aber dann wrde
das eigentlich richtige Passwort (Cyberface) in der gecrackten Version nicht mehr funktionieren. Klar, oder ...?!
Eleganter whre also in diesem Fall, wenn das Programm diesen Befehl einfach auslassen wrde und normal fortfahren wrde,
da ja darunter gleich "Passwort ist richtig!" steht.
Dafr gebrauchen wir jetzt einen neuen Befehl: Den nop Befehl!
nop steht fr "no operation". Das bedeutet also: Er macht an dieser Stelle einfach garnichts und fhrt normal fort.
Also berschreiben wir den jne Befehl mit einem nop Befehl:
Offset aufschreiben (nicht vergessen: die Zeile, in der der jne Befehl steht mu mit einem hinterlegt sein),
in HexWorkshop wechseln und zuerst einmal die Zahl 75 (steht fr jne) mit der Zahl 90 (steht fr nop) berschreiben.
Doch das gengt beim nop Befehl noch nicht! Dazu mu ich ein bichen weiter ausholen:
In W32DASM sieht man auch den HEX-Code der einzelnen Befehle.
hier ein kleines Beispiel:

     Dieser Teil ist der Hex-Code von diesem Befehl
           |                              |
:0042CE15 750C                    jne 0042CE23
           
Bei diesem Beispiel whre also der Hex-Code fr den Befehl jne 0042CE23: 750C
Im HexWorkshop sieht man also an dieser Stelle auch 750C.
Wrden wir den jne Befehl mit (z.B.) einem je Befehl austauschen wollen, dann bruchten wir nur den 1. Teil
des HEX-Codes (75) mit 74 (steht fr je) zu berschreiben. Daraus ergbe sich dann der Befehl (in W32DASM) je 0042CE23.
Bei einem nop Befehl mu man aber den ganzen Befehl (in diesem Beispiel also 750C) mit 90 berschreiben. Im HexWorkshop
also 9090 ber 750C schreiben. Sonst gibt es im gecrackten Programm eine Fehlermeldung!

Wir machen da also beim 3. und letzten jne Befehl.


* Possible StringData Ref from Code Obj ->"hallo"               <== Die Passwortabfrage startet hier!
                                  |
:0042CE0B BAC8CE4200              mov edx, 0042CEC8
:0042CE10 E8BB6AFDFF              call 004038D0
:0042CE15 750C                    jne 0042CE23                  <== mit einem jmp Befehl berschreiben
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CDB0(C)
|

* Possible StringData Ref from Code Obj ->"Passworteingabe falsch!"
                                  |
:0042CE17 B8D8CE4200              mov eax, 0042CED8
:0042CE1C E89BFCFFFF              call 0042CABC
:0042CE21 EB7B                    jmp 0042CE9E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CE15(C)
|
:0042CE23 8D55FC                  lea edx, dword ptr [ebp-04]
:0042CE26 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042CE2C E8AFCFFEFF              call 00419DE0
:0042CE31 8B45FC                  mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"pass"
                                  |
:0042CE34 BAF8CE4200              mov edx, 0042CEF8
:0042CE39 E8926AFDFF              call 004038D0
:0042CE3E 750C                    jne 0042CE4C                      <== 2. jne Befehl

* Possible StringData Ref from Code Obj ->"Passworteingabe falsch!"
                                  |
:0042CE40 B8D8CE4200              mov eax, 0042CED8
:0042CE45 E872FCFFFF              call 0042CABC
:0042CE4A EB52                    jmp 0042CE9E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CE3E(C)
|
:0042CE4C 8D55FC                  lea edx, dword ptr [ebp-04]        <== hier gehts nach "pass" weiter
:0042CE4F 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042CE55 E886CFFEFF              call 00419DE0
:0042CE5A 8B45FC                  mov eax, dword ptr [ebp-04]
:0042CE5D 8B1510F74200            mov edx, dword ptr [0042F710]
:0042CE63 E8686AFDFF              call 004038D0
:0042CE68 750C                    jne 0042CE76             <== letzter jne Befehl (750C mit 9090 berschreiben)

* Possible StringData Ref from Code Obj ->"Passwort ist richtig!"
                                  |
:0042CE6A B808CF4200              mov eax, 0042CF08      <== Das Programm fhrt dann in jedem Fall hier fort!
:0042CE6F E848FCFFFF              call 0042CABC
:0042CE74 EB28                    jmp 0042CE9E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042CE68(C)
|
:0042CE76 8D55FC                  lea edx, dword ptr [ebp-04]
:0042CE79 8B83DC010000            mov eax, dword ptr [ebx+000001DC]
:0042CE7F E85CCFFEFF              call 00419DE0
:0042CE84 8B45FC                  mov eax, dword ptr [ebp-04]
:0042CE87 8B1510F74200            mov edx, dword ptr [0042F710]
:0042CE8D E83E6AFDFF              call 004038D0
:0042CE92 740A                    je 0042CE9E

* Possible StringData Ref from Code Obj ->"Passworteingabe falsch!"
                                  |
:0042CE94 B8D8CE4200              mov eax, 0042CED8
:0042CE99 E81EFCFFFF              call 0042CABC


Jetzt schlieen wir W32DASM und speichern die geffnete PASS2.EXE in HexWorkshop.
Nun starten wir PASS2.EXE, geben nichts ein und klicken auf OK.
und ... siehe da! Das Programm meldet: "Passwort ist richtig!" !!!
und das bei jedem beliebigen Wort das wir eingeben (auch "hallo", "pass" und "Cyberface") !!!

Das Programm ist perfekt gecrackt ;-> !!!!


So, ich hoffe ihr hab alle gecheckt (besonders den nop Befehl). Wers nicht ganz kapiert hat, fr den (oder die) habe ich
hier noch eine Liste aller Befehle, die ich bis jetzt (in Teil 1 und Teil 2) erklrt habe, aufgestellt:

je     steht fr jump if equal       HEX-Code: 74
jne    steht fr jump if not equal   HEX-Code: 75
jmp    steht fr jump to             HEX-Code: EB
nop    steht fr no operation        HEX-Code: 90

... und nicht vergessen: Mit einem nop Befehl immer den ganzen (!) Befehl berschreiben!


Soviel zur Cyberface Cracking Tour 1999. Wenn ich gengent Feedback bekomme, werde ich vielleicht noch eine Cyberface Cracking Tour 1999/2 (CCT99/2) schreiben.
CCT99/2 wird dann sicher noch lnger und beschftigt sich mit schwieriger zu crackenden Software. Vielleicht zeige ich euch dann wie man die neuesten Spiele crackt ...
Anregungen, Wnsche, Lob und Kritik bitte an: cyberface@mail.com

Geetings to:

* ________________________________________________________________________ *
 /                                                                        \
 | GCG, sn00pee (cooler Tutor), and all other crackers (and newbies ;-))! |
 \________________________________________________________________________/
*                                                                          *

SEE YA!
Cyberface

 _                         _
()                       ()
 =                         =
 | Cyberface Cracking Tour |
 |          1999           |
 |         Teil 2          |
 